home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / Booting Gallery / Booting Gallery (source) / Sources / Sprite Sources / SpriteGame.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-06-22  |  3.7 KB  |  221 lines  |  [TEXT/BROW]

  1. #include "SpriteGame.h"
  2. #include "GWorldUtils.h"
  3. #include "SoundManager.h"
  4.  
  5. CSpriteGame::CSpriteGame(short imageID)
  6.     :    fWorld(NULL),
  7.         fSafeHeap(NULL),
  8.         fSoundManager(NULL),
  9.         fImageID(imageID)
  10. {
  11. }
  12.  
  13.  
  14. Boolean        CSpriteGame::GetImage(short imageID,GWorldPtr& outGWorld,RgnHandle& outMask)
  15. {
  16.     Boolean        foundItQ = false;
  17.     
  18.     for(short z = 0;z<fImageList.Size();z++){
  19.         if(fImageList[z].id == imageID){
  20.             outGWorld = fImageList[z].gWorld;
  21.             outMask = fImageList[z].maskRgn;
  22.             foundItQ = true;
  23.             break;
  24.         }
  25.     }
  26.     
  27.     return foundItQ;
  28. }
  29.  
  30.  
  31. OSErr    CSpriteGame::PreloadGameImages()
  32. {
  33.     OSErr            err = noErr;
  34.     StSaveGWorld    save;
  35.     
  36.     short**        list = (short**)Get1Resource('IMGE',fImageID);
  37.     
  38.     if(list == NULL){
  39.         err = ResError();
  40.         if(err == noErr){
  41.             err = resNotFound;
  42.         }
  43.     }else{
  44.         short    num = GetHandleSize((Handle)list)/sizeof(short);
  45.         
  46.         err = fImageList.Reallocate(num);
  47.         if(err == noErr){
  48.             for(short z = 0;z<num;z++){
  49.                 fImageList[z].gWorld = NULL;
  50.                 fImageList[z].maskRgn = NULL;
  51.             }
  52.             Rect        bounds = {0,0,32,32};
  53.             
  54.             for(short z = 0;z<num;z++){
  55.                 fImageList[z].id = (*list)[z];
  56.                 
  57.                 err = NewCIconGWorld(fImageList[z].id,&fImageList[z].gWorld,&fImageList[z].maskRgn);
  58.                 if(err == noErr){
  59.                     HLock((Handle)fImageList[z].maskRgn);
  60.                 }else{
  61.                     err = noErr;
  62.                 }
  63.             }
  64.         }
  65.     }
  66.     
  67.     return err;
  68. }
  69.  
  70. GWorldPtr        CSpriteGame::GetImage(short imageID)
  71. {
  72.     Entry*        entry = LocateEntryByID(imageID);
  73.     
  74.     if(entry == NULL){
  75.         return NULL;
  76.     }else{
  77.         return entry->gWorld;
  78.     }
  79. }
  80.  
  81.  
  82. RgnHandle        CSpriteGame::GetImageMask(short imageID)
  83. {
  84.     Entry*        entry = LocateEntryByID(imageID);
  85.     
  86.     if(entry == NULL){
  87.         return NULL;
  88.     }else{
  89.         return entry->maskRgn;
  90.     }
  91. }
  92.  
  93.  
  94. CSpriteGame::Entry*    CSpriteGame::LocateEntryByID(short inID)
  95. {
  96.     Entry*        result = NULL;
  97.     
  98.     for(short z = 0;z<fImageList.Size();z++){
  99.         if(fImageList[z].id == inID){
  100.             result = &fImageList[z];
  101.             break;
  102.         }
  103.     }
  104.     
  105.     return result;
  106. }
  107.  
  108.  
  109. void            CSpriteGame::PlaySound(short sndID,Boolean loopQ)
  110. {
  111.     fSoundManager->PlaySound(sndID,loopQ);
  112. }
  113.  
  114.  
  115.  
  116. void            CSpriteGame::StartGame()
  117. {
  118.     fWorld->Start();
  119. }
  120.  
  121.  
  122. void            CSpriteGame::StopGame()
  123. {
  124.     fWorld->Stop();
  125. }
  126.  
  127.  
  128. void        CSpriteGame::DrawBackground(const Rect& inBounds)
  129. {
  130.     
  131. }
  132.  
  133.  
  134. OSErr            CSpriteGame::Initialize()
  135. {
  136.     OSErr        err = noErr;
  137.     
  138.     fSafeHeap = new CStaticHeap(fMacHeap, kHeapSize);
  139.     if(!fSafeHeap->HeapOK()){
  140.         err = -108;
  141.     }else{
  142.         MHeapObject::SetObjectHeap(fSafeHeap);
  143.         
  144.         fSoundManager = new SoundManager(err);
  145.         if(err == noErr){
  146.             err = PreloadGameImages();
  147.             if(err == noErr){
  148.                 fWorld = new CSpriteWorld(err);
  149.                 if(err == noErr){
  150.                     StSaveGWorld        saveGWorld;
  151.                     
  152.                     fWorld->GetBackgroundCanvas()->PrepareToDraw();
  153.                     DrawBackground(*fWorld->GetBackgroundCanvas()->GetBounds());
  154.                 }
  155.             }
  156.         }
  157.     }
  158.     
  159.     return err;
  160. }
  161.  
  162.  
  163.  
  164. CGameSprite::CGameSprite(CSpriteWorld* world,CSpriteGame* game,long id,GWorldPtr image,
  165.                         short startTop,short startLeft,RgnHandle mask)
  166.     :    CPixMapSprite(world, id, image, startTop, startLeft, mask),
  167.         fGame(game)
  168. {
  169. }
  170.  
  171.  
  172. CGameSprite::~CGameSprite()
  173. {
  174. }
  175.  
  176. void                CGameSprite::SetImageID(short inID)
  177. {
  178.     GWorldPtr        gWorld;
  179.     RgnHandle        mask;
  180.     
  181.     if(fGame->GetImage(inID, gWorld, mask)){
  182.         SetImage(gWorld, mask);
  183.     }
  184. }
  185.  
  186. void                CGameSprite::PlaySound(short soundID)
  187. {
  188.     fGame->PlaySound(soundID);
  189. }
  190.  
  191.  
  192.  
  193.  
  194. CSpriteGame::~CSpriteGame()
  195. {
  196.     delete fWorld;
  197.     delete fSafeHeap;
  198.     delete fSoundManager;
  199.     
  200.     for(short z = 0;z<fImageList.Size();z++){
  201.         if(fImageList[z].gWorld != NULL){
  202.             DisposeGWorld(fImageList[z].gWorld);
  203.         }
  204.         if(fImageList[z].maskRgn != NULL){
  205.             DisposeRgn(fImageList[z].maskRgn);
  206.         }
  207.     }
  208. }
  209.  
  210.  
  211. OSErr    CSpriteGame::IntroduceExtensionIcon(GWorldPtr image,RgnHandle mask)
  212. {
  213.     OSErr        err = noErr;
  214.     
  215.     // ##BUG## need to track the image and mask so I can delete them later
  216.     
  217.     MakeExtensionSprite(image,mask);
  218.     
  219.     return err;
  220. }
  221.